package java_thinking.unit_18_IO;

/**
 * @Desc:   装饰设计模式 必看：https://blog.csdn.net/maihilton/article/details/81544626
 *      1.定义：Decorator装饰器,就是动态地给一个对象添加一些额外的职责，动态扩展，与继承(静态扩展)比较，有以下特征：
 *          1.1 它必须有一个被装饰的对象(作为成员变量)；
 *          1.2 它必须拥有与被装饰对象相同的接口(多态调用、扩展需要)；
 *          1.3 它可以给被装饰对象添加额外的功能。
 *          总结：保持接口，动态增强性能。
 *
 *      2.装饰器通过包装一个装饰对象来扩展其功能，而又不改变其接口，这实际上是基于对象的适配器模式的一种变种。
 *        与对象的适配器模式异同：
 *          相同点：都拥有一个目标对象。
 *          不同点：适配器模式需要实现重写旧接口，而装饰器模式必须实现相同接口。
 *      适配器模式是在适配器中，重写旧接口的方法来调用新接口方法，实现旧接口不改变，同时使用新接口的目的。新接口适配旧接口。
 *      而装饰模式，是装饰器和旧接口实现相同的接口，在调用新接口的方法中，会调用旧接口的方法，并对其进行扩展。
 *
 *      3.为什么要用装饰模式：
 *        1.由于java I/O库需要很多性能的各种组合，如果这些性能都是用继承来实现，那么每一种组合都需要一个类，
 *        这样就会造成大量重复的类出现。如果采用装饰模式，那么类的数目就会大大减少，性能的重复也可以减至最少
 *        2.在不影响其他对象的情况下，以动态、透明的方式给单个对象添加职责。
 *        3.处理那些可以撤消的职责。
 *
 *      4.输入流-装饰模式的各个角色
 *         在所有InputStream类型的链接流处理其中，使用频率最大的就是FilterInputStream类，以这个类为抽象装饰角色的装饰模式结
 *         构非常明显和典型。以这个类为核心说明装饰模式的各个角色是由哪些流处理器扮演：
 *
 *       4.1抽象构件(Component)角色：由InputStream扮演。这是一个抽象类，为各种子类型处理器提供统一的接口。
 *       4.2具体构建(Concrete Component)角色：由ByteArrayInputStream、FileInputStream、PipedInputStream 以及
 *          StringBufferInputStream等原始流处理器扮演。它们实现了抽象构建角色所规定的接口，可以被链接流处理器所装饰。
 *       4.3抽象装饰(Decorator)角色：由FilterInputStream扮演。它实现了InputStream所规定的接口。
 *       4.4具体装饰(Concrete Decorator)角色：由几个类扮演，分别是DateInputStream、BufferedInputStream以及两个不常用到的
 *          类LineNumberInputStream和PushbackInputStream。
 *
 *          一方面，链接流对象接受一个(同类型的)原始流对象或者另一个(同类型的)链接流对象作为流源；另一方面，它们都对流源
 *          对象的内部工作方法做了相应的改变，这种改变是装饰模式所要达到的目的。比如：
 *      (1)BufferedInputStream “装饰” 了InputStream的内部工作方式，使得流的读入操作使用缓冲机制。在使用了缓冲机制后，不会
 *         对每一次的流读入操作都产生一个物理的读盘动作，从而提高了程序的效率。在涉及到物理流的读入时，都应当使用这个装饰流类。
 *      (2)LineNumberInputStream和PushbackInputStream也同样“装饰”了InputStream的内部工作方式， 前者使得程序能够按照行号
 *         读入数据；后者能使程序在读入的过程中退后一个字符。后两个装饰类可能在实际的编程工作中很少用到，因为它们是为了支持用
 *         java语言做编译器而准备的。
 *      (3)DateInputStream子类读入各种不同的原始数据类型以及String类型的数据，这一点可以从它提供的各种read()方法看出来：
 *         readByte()、readUnsignedByte()、readShort()、readUnsignedShort()、readChar()、readInt()、readLong()、
 *         readFloat()、readDouble()、readUTF()。使用这个流处理器以及它的搭档DateOutputStream，可以将原始数据通过流从
 *         一个地方移到另一个地方。
 *
 *      5.输出流-装饰模式的各个角色
 *        5.1 抽象构件(Component)角色：由OutputStream扮演，这是一个抽象类，为各种的子类型流处理器提供统一的接口。
 * 　　   5.2 具体构件(Concrete Component)角色：由ByteArrayOutputStream、FileOutputStream、PipedOutputStream等扮演，它们均实现了OutputStream所声明的接口。
 * 　　   5.3 抽象装饰(Decorator)角色：由FilterOutputStream扮演，它与OutputStream有相同的接口，而这正是装饰类的关键。
 * 　　   5.4 具体装饰(Concrete Decorator)角色：由几个类扮演，分别是BufferedOutputStream、DateOutputStream、以及PrintStream。
 *
 * @author: cww
 * @DateTime: 2019/5/20 19:31
 */

public class DecoratorTheory {
}
